package com.cencat.common.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 基础Mapper接口
 * 继承MyBatis-Plus的BaseMapper，提供通用的数据访问方法
 * 
 * @param <T> 实体类型
 * @author cencat
 * @since 2024-01-01
 */
public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {

    /**
     * 根据租户ID查询列表
     * 
     * @param tenantId 租户ID
     * @return 实体列表
     */
    List<T> selectListByTenantId(@Param("tenantId") Long tenantId);

    /**
     * 根据租户ID分页查询
     * 
     * @param page 分页参数
     * @param tenantId 租户ID
     * @return 分页结果
     */
    IPage<T> selectPageByTenantId(IPage<T> page, @Param("tenantId") Long tenantId);

    /**
     * 根据租户ID和条件查询
     * 
     * @param queryWrapper 查询条件
     * @param tenantId 租户ID
     * @return 实体列表
     */
    List<T> selectListByTenantIdAndWrapper(@Param("ew") Wrapper<T> queryWrapper, @Param("tenantId") Long tenantId);

    /**
     * 根据租户ID和条件分页查询
     * 
     * @param page 分页参数
     * @param queryWrapper 查询条件
     * @param tenantId 租户ID
     * @return 分页结果
     */
    IPage<T> selectPageByTenantIdAndWrapper(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper, @Param("tenantId") Long tenantId);

    /**
     * 根据租户ID统计数量
     * 
     * @param tenantId 租户ID
     * @return 数量
     */
    Long selectCountByTenantId(@Param("tenantId") Long tenantId);

    /**
     * 根据租户ID批量删除
     * 
     * @param idList ID列表
     * @param tenantId 租户ID
     * @return 删除数量
     */
    int deleteBatchByTenantId(@Param("idList") Collection<? extends Serializable> idList, @Param("tenantId") Long tenantId);

    /**
     * 根据租户ID物理删除
     * 
     * @param id 主键ID
     * @param tenantId 租户ID
     * @return 删除数量
     */
    int deleteByIdAndTenantId(@Param("id") Serializable id, @Param("tenantId") Long tenantId);
}